package com.hr.String不可变性;

import org.junit.Test;

/**
 * @program: leetcode
 * @description:
 * @author: HuRan QQ1345122890
 * @create: 2021-03-02 20:35
 */
public class StringIntern {
    public static void main(String[] args) {
        String s = new String("1");
        String intern = s.intern(); //调用此方法之前字符串常量池中已经有1了
        String s2 = "1";
        // s指向堆的地址  s2指向常量池的地址
        System.out.println(s == s2);// jdk6:false  jdk7+ false
        System.out.println(intern == s2);//true
        String s3 = new String("1") + new String("1");
        //执行完上一行带代码后 字符串常量池中 不存在11
        s3.intern();//调用此方法之前常量池中还没有11
        //执行完上一行代码后 字符串常量池中 存在了11 jdk6中创建了一个新的对象 就有了新的地址 jdk7+记录了原来new的地址
        String s4 = "11";
        System.out.println(s3 == s4);// jdk6:false  jdk7+ false
    }

    /**
     * new String("ab")会创建几个对象，看字节码
     * <p>
     * new String("a")+new String("b")?
     */
    @Test
    public void test() {
        // 2个对象 一个new String() 一个 sxx常量池
        String s = new String("sxx");
    }

    @Test
    public void test2() {

        /**
         * 1 new StringBuilder()
         * 2 new String("a")
         * 3.常量池中的a
         * 4.new String("b")
         * 5.常量池中的b
         * 深入剖析：
         *  StringBuidler的toString()
         *  new 了一个new Strng()
         *  强调一下，字符串常量池中并没有生产"ab"
         */
        String str = new String("a") + new String("b");
    }
}